package br.edu.senai.controller;

import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.JOptionPane;

/**
 * @author william.chenta
 */
public class Conexao implements Serializable {

    private static EntityManagerFactory factory;
    private EntityManager em;
    private boolean conectou = false;

    public boolean conectar() {
        try {
            factory = Persistence.createEntityManagerFactory("AmbientalPU");
            em = factory.createEntityManager();
            conectou = true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível conectar ao banco de dados\n" + e.getMessage());
            System.exit(0);
        }
        return conectou;
    }

    public void desconectar() {
        try {
            em.close();
            factory.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Ocorreu um erro ao tentar se desconectar do banco de dados");
        }
    }

    public void persist(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.persist(o);
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    public void alterar(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.merge(o);
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    public void excluir(Object o) {
        if (conectar()) {
            try {
                em.getTransaction().begin();
                em.remove(em.merge(o));
                em.getTransaction().commit();
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                desconectar();
            }
        }
    }

    public EntityManager getEm() {
        if (!em.isOpen()) {
            conectar();
        }
        return em;
    }
}
